本日的學習目標是理解如何建構一個簡單的醫療 API,能夠接收病人資料,並結合 Token 與角色權限控管 (RBAC) 驗證使用者存取權限,同時將資料安全地儲存到資料庫。這讓你能將前幾天學到的加密、存取控制以及 IoT 裝置數據整合,打造更完整的醫療資訊系統。
一、理論重點
二、案例分享
2021 年,新加坡某醫院推行遠距血壓監測計畫,病人使用智慧血壓計測量數據後自動上傳至醫院雲端系統,醫師透過 API 查詢自己病人的血壓紀錄,系統使用 API Token 與 RBAC 控制存取,並透過 HTTPS 加密傳輸,確保數據安全與隱私,實際減少了不必要的門診次數且未發生數據外洩。
三、簡單程式範例
serevr.py
from fastapi import FastAPI, Request, HTTPException
import mysql.connector
app = FastAPI()
# 假設簡單 Token
TOKENS = {
"patient123": "patient",
"doctor123": "doctor"
}
# MySQL 連線設定
DB_CONFIG = {
"host": "localhost",
"user": "root",
"password": "我的密碼",
"database": "health_db"
}
# 初始化資料庫
def init_db():
# 先連線 MySQL 建資料庫(如果不存在)
conn = mysql.connector.connect(
host=DB_CONFIG["host"],
user=DB_CONFIG["user"],
password=DB_CONFIG["password"]
)
cur = conn.cursor()
cur.execute(f"CREATE DATABASE IF NOT EXISTS {DB_CONFIG['database']}")
conn.commit()
conn.close()
# 建資料表
conn = mysql.connector.connect(**DB_CONFIG)
cur = conn.cursor()
cur.execute("""
CREATE TABLE IF NOT EXISTS blood_pressure (
id INT AUTO_INCREMENT PRIMARY KEY,
systolic INT,
diastolic INT,
pulse INT
)
""")
conn.commit()
conn.close()
init_db()
# 病人上傳血壓資料 API
@app.post("/upload")
async def upload(request: Request):
token = request.headers.get("Authorization")
if TOKENS.get(token) != "patient":
raise HTTPException(status_code=401, detail="Unauthorized")
data = await request.json()
conn = mysql.connector.connect(**DB_CONFIG)
cur = conn.cursor()
cur.execute(
"INSERT INTO blood_pressure (systolic, diastolic, pulse) VALUES (%s, %s, %s)",
(data["systolic"], data["diastolic"], data["pulse"])
)
conn.commit()
conn.close()
return {"status": "success", "data": data}
# 醫師查詢最近五筆血壓紀錄 API
@app.get("/records")
def records(request: Request):
token = request.headers.get("Authorization")
if TOKENS.get(token) != "doctor":
raise HTTPException(status_code=401, detail="Unauthorized")
conn = mysql.connector.connect(**DB_CONFIG)
cur = conn.cursor()
cur.execute("SELECT * FROM blood_pressure ORDER BY id DESC LIMIT 5")
rows = cur.fetchall()
conn.close()
return {"records": rows}
上面的程式打完後就可以開始執行步驟,在VsCode中執行
uvicorn server:app --reload
接著就可以用Python模擬上傳病人資料
import requests
url = "http://127.0.0.1:8000/upload"
data = {"systolic": 120, "diastolic": 80, "pulse": 70}
headers = {"Authorization": "patient123"}
res = requests.post(url, json=data, headers=headers)
print(res.json())
用醫生的token查詢資料
import requests
url = "http://127.0.0.1:8000/records"
headers = {"Authorization": "doctor123"}
res = requests.get(url, headers=headers)
print(res.json())
執行的結果如下